
package Type;

import java.io.File;
import java.io.IOException;

import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;

/**
 * La classe AudioSound gere les fichiers sonores de l'application 
 * AudioSound implemente l'interface <code>Runnable</code>
 *
 * @author      Frank Djomo
 * @author      Christelle SIAGO HAPPI
 * @author      djomopoueme@gmail.com
 * @author      christelle.siagohappi@gmail.com
 * @version     1.0
 */
 public class AudioSound implements Runnable{
    
    private SourceDataLine line;
    private File file;
    private AudioInputStream audioInputStream;	
    private AudioFormat audioFormat;
    private boolean stop;	
    
    /**
     * Constructeur
     * @param url   URL du fichier sonore à lire
     */
    public AudioSound(URL url)
    {
        stop=false;
        try {
            System.out.println("Ouverture du fichier sonore "+url);
            //file =new File(url.toURI());
            audioInputStream = AudioSystem.getAudioInputStream(url);
             //Il est nécessaire de connaître le format audio du fichier
            // pour permettre à java de créer l'objet DataLine adéquat
            audioFormat = audioInputStream.getFormat();
            // spécifier le type de DataLine qu'on veut SourceDataLine pour la lecture
            DataLine.Info info = new DataLine.Info(SourceDataLine.class,audioFormat);
             // On récupère le DataLine adéquat et on l'ouvre
            line = (SourceDataLine) AudioSystem.getLine(info);
        } catch (LineUnavailableException ex) {
            Logger.getLogger(AudioSound.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedAudioFileException ex) {
            Logger.getLogger(AudioSound.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(AudioSound.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    /**
     * La methode <code>run</code> est exécuté par le thread de la classe AudioSound
     */
    @Override
    public void run() {
        stop = false;
        try {
             // Avant toute chose il est nécessaire d'ouvrir la ligne
             // et rediriger le flux sur la carte son 
            line.open(audioFormat);
            line.start();
            // il faut maintenant écrire sur la ligne. Travail comme sur un
            // inputStream quelconque
            byte bytes[] = new byte[1024];
            int bytesRead=0;			
            while (((bytesRead = audioInputStream.read(bytes, 0, bytes.length)) != -1)
                            && !stop) {

                    line.write(bytes, 0, bytesRead);
            }

        } catch (IOException ex) {
            Logger.getLogger(AudioSound.class.getName()).log(Level.SEVERE, null, ex);
        } catch (LineUnavailableException ex) {
            Logger.getLogger(AudioSound.class.getName()).log(Level.SEVERE, null, ex);
            return;
        }
        finally{
            // on ferme la ligne à la fin
            line.close();
        }	
    }
    /**
    * Gère l'arrêt de la lecture
    */
    public void stop() {
        stop=true;
    }
 }
